package com.niezhipeng.publish_subscribe;

import com.niezhipeng.utils.ConnectFactoryUtils;
import com.rabbitmq.client.*;

import java.nio.charset.StandardCharsets;

public class ReceiveLogs {
    private static final String EXCHANGE_NAME = "logs";

    public static void main(String[] argv) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        ConnectFactoryUtils.setFactoryConfig(factory);
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.FANOUT);
        // 在 Java 客户端中，当我们不向queueDeclare()提供任何参数时 ，我们会创建一个具有生成名称的非持久的、独占的、自动删除的队列
        // 一旦我们断开消费者的连接，队列就会自动删除
        String queueName = channel.queueDeclare().getQueue();
        // 我们已经创建了一个广播交换器和一个队列。现在我们需要告诉交换器将消息发送到我们的队列。
        // 交换器和队列之间的关系称为绑定。
        // 我们需要提供一个routingKey，但它的值对于广播交换机会被忽略
        channel.queueBind(queueName, EXCHANGE_NAME, "");

        System.out.println(" [*] Waiting for messages");

        DeliverCallback deliverCallback = (consumerTag, delivery) -> {
            String message = new String(delivery.getBody(), StandardCharsets.UTF_8);
            System.out.println(" [x] Received '" + message + "'");
        };
        channel.basicConsume(queueName, true, deliverCallback, consumerTag -> { });
    }
}

